Я не уверен, как на самом деле выразить свой вопрос словами, поэтому позвольте мне попытаться объяснить его на примере: Допустим, моя программа при определенном действии ведет себя странно. Я уже нашел код, который является причиной такого странного поведения. При отключении этой последовательности я не сталкиваюсь с таким поведением. К сожалению, мне нужен этот код, потому что тогда что-то еще не работает. Итак, что я собираюсь сделать дальше, это выяснить, почему что-то идет по-другому, когда этот фрагмент кода активен. Чтобы лучше понять, что происходит, я иногда хочу запустить все действие, включая «плохой код», а иногда и без него. Затем я могу сравнить результат, например, что происходит в пользовательском интерфейсе или что возвращает моя функция. Первый подход, который приходит мне в голову, - запустить мою программу с включенным кодом, делать все, что я хочу, затем остановить мою программу, закомментировать код, перекомпилировать и запустить снова. Гм ... это звучит глупо. Особенно, если мне снова нужно включить этот код, чтобы в другой раз увидеть другое поведение, а затем снова выключить, включить, выключить и так далее. Для меня не вариант использовать точки останова и влиять на порядок операторов или изменять значения, чтобы запускать или не запускать операторы if, циклы for и т. Д. Два примера: Я отлаживаю критическое по времени поведение, и когда я останавливаю программу, время значительно меняется. Таким образом, первая точка останова, которую я могу установить, должна быть в конце действия. 1 Я ожидаю, что появится всплывающая подсказка или другое окно, которое «подавляется», когда фокус передается VS. Таким образом, я вообще не могу использовать точки останова. Ни в начале, ни в конце действия. Есть ли в Visual Studio 2012 какой-либо метод, который позволяет мне пометить этот код как необязательный, и я могу решить, хочу ли я запускать эту последовательность кода, прежде чем я выполню действие? Я думаю о чем-то вроде if (true | false) на более высоком уровне. Я не ищу решения, при котором мне нужно повторно запускать программу несколько раз. В этом случае я все еще мог бы использовать простой подход, просто закомментировав код с помощью #if false. 1 Обратите внимание, что я, конечно, могу установить точку останова, когда мне нужно просмотреть конкретную переменную в определенной позиции (если я не записал значение в вывод), но снова отключу точки останова, чтобы выполнить все действие за один идти.
2020-12-07 23:10:54
В отладчике Visual Studio вы можете установить точку останова прямо перед вашим «рассматриваемым кодом». Когда код останавливается в этой точке, вы можете позволить ему продолжить или щелкнуть правой кнопкой мыши любую другую строку и выбрать «Установить следующий оператор». Это странный вариант, но я его оценил. | Единственный вариант, который я могу придумать, - это добавить что-то в ваш пользовательский интерфейс, который появляется только при отладке, что дает вам возможность включать / исключать рассматриваемые операции. Пока вы это делаете, вы можете также включить сброс приложения в «известное состояние» из пользовательского интерфейса. | Я думаю о чем-то вроде if (true | false) на более высоком уровне. Почему «на более высоком уровне»? Почему бы не использовать именно это? Вы хотите, чтобы фрагмент кода иногда выполнялся, а иногда нет, и переключатель должен быть изменен во время выполнения, а не во время компиляции - это, очевидно, приводит к если (условие) { // код на ставке } Загвоздка здесь в том, какое условие вы будете использовать - возможно, переменную, которую вы установили на true в выпускной версии вашего кода, и на false иногда в вашей отладочной версии. Может быть, значение взято из файла конфигурации, может быть, из переменной окружения, может быть вычислено какой-то логикой в вашей программе, что угодно и когда угодно. РЕДАКТИРОВАТЬ: вы также можете ввести логическую переменную в свой код для условия, инициализировать ее по умолчанию и изменить ее значение, используя отладчик, когда захотите. | Директивы препроцессора могут быть тем, что вам нужно. Это фрагменты кода для выполнения компилятором, идентифицируемые по началу с символа # (и стилистически по умолчанию они не следуют шаблону отступа вашего кода, вместо этого всегда твердо располагаются в левом краю редактора. ): #define INCLUDE_DODGY_CODE public void MyMethodWithDodgyBits () { #if INCLUDE_DODGY_CODE myDodgyMethod (); #endif myOkMethod (); } В этом случае, если был включен #define INCLUDE_DODGY_CODE, вызов myDodgyMethod () будет скомпилирован в вашу программу. В противном случае вызов будет пропущен компилятором и просто не будет существовать в вашем двоичном файле. | Как вы спросите, есть несколько вариантов отладки. В Visual Studio есть несколько параметров для прямой навигации по коду. Вы можете использовать функцию Set Next Statement для перехода непосредственно к определенному оператору. Вы также можете напрямую редактировать значения через окно немедленного доступа, QuickWatch и всплывающую подсказку, которая наводит курсор на переменные во время отладки. Visual Studio также имеет возможность воспроизводить историю выполнения. Взгляните на IntelliTrace, чтобы начать работу. Это может быть полезно, когда у вас есть несколько проблемных областей, которые взаимодействуют и создают состояние ошибки. Вы также можете заключить свои разделы кода в условные блоки и установить соответствующие условные переменные. Это может быть во время отладки, или вы можете передать параметры через файл конфигурации. Использование условных проверок может быть проще, чем ручное пошаговое выполнение кода, если есть ряд операторов, которые вы хотите исключить. | Иногда это зависит от версии VS и языка, но вы можете с радостью отредактировать код (чтобы закомментировать его или обернуть в большой #ifdef 0), затем нажмите alt + F10, и компилятор перекомпилирует, повторно связывает и продолжит выполнение как будто вы никогда не возились с этим. Но хотя это прекрасно работает в VC ++ (начиная с VS v6 IIRC), у C # могут быть проблемы - я обнаружил (с VS2010), что я не могу редактировать и продолжать таким образом с функциями, содержащими любые лямбда-операторы (в основном linq), и 64-битный код никогда не делал этого тоже. Тем не менее, с этим стоит поэкспериментировать, поскольку иногда это действительно полезно. | Я работал над приложениями, в которых есть дополнительный код, используемый только для отладки, который не должен появляться в производственной среде. Этот сегмент необязательного кода было проще всего контролировать с помощью файла конфигурации, поскольку для его изменения не требовалась повторная компиляция. Такое исправление может не быть концом для вашего конечного результата, но оно может помочь пройти через него, пока исправление не будет найдено. Если у вас есть несколько необязательных разделов, которые необходимо протестировать в сочетании, этот стиль исправления может потребовать нескольких ключей в файле конфигурации, что может быть недостатком и проблемой, которую нужно отслеживать. | Ваш вопрос не совсем ясен, возможно, поэтому существует так много ответов, которые, по вашему мнению, неверны. Вы можете изменить его формулировку, если кажется, что никто не может ответить на вопрос. Рискуя дать еще один неверный ответ, я добавлю немного информации о том, как я справлялся с этой проблемой в прошлом. Самый простой способ - поместить любой дополнительный код в #if DEBUG // Дополнительный код здесь #endif Таким образом, при запуске в режиме отладки код реализуется, а при запуске в режиме выпуска - нет. Для переключения между ними нужно нажать одну кнопку. Я также решил ту же проблему аналогичным образом с помощью простого флага: bool runOptionalCode = false; тогда если (runOptionalCode) { // Поместите сюда необязательный код } Еще раз,переключение между режимами требует изменения одного слова, поэтому это простая задача. Вы упоминаете об этом в своем вопросе, но сбрасываете со счетов по неясным причинам. Как я уже сказал, для переключения между ними требуется совсем немного усилий. Если вам нужно внести изменения между кодом во время его работы, лучший способ - использовать элемент пользовательского интерфейса или нажатие клавиши, которое изменяет флаг, упомянутый в примере выше. В зависимости от вашего приложения, это может потребовать больше усилий, чем оно того стоит. Раньше я обнаруживал, что когда у меня есть ключевой слушатель, уже реализованный как часть проекта, лучше всего работает пара нажатий клавиш, чтобы решить, запускать ли мой отладочный (необязательный) код. В приложении без ключевых слушателей я бы предпочел использовать один из предыдущих методов. | Ваш ответ StackExchange.ifUsing ("редактор", function () { StackExchange.using ("externalEditor", function () { StackExchange.using ("сниппеты", function () { StackExchange.snippets.init (); }); }); }, "фрагменты кода"); StackExchange.ready (функция () { var channelOptions = { теги: "" .split (""), id: "1" }; initTagRenderer ("". split (""), "" .split (""), channelOptions); StackExchange.using ("externalEditor", function () { // Должен запускать редактор после сниппетов, если сниппеты включены if (StackExchange.settings.snippets.snippetsEnabled) { StackExchange.using ("сниппеты", function () { createEditor (); }); } else { createEditor (); } }); function createEditor () { StackExchange.prepareEditor ({ useStacksEditor: ложь, heartbeatType: 'ответ', autoActivateHeartbeat: ложь, convertImagesToLinks: правда, noModals: правда, showLowRepImageUploadWarning: true, ReputationToPostImages: 10, bindNavPrevention: правда, постфикс: "", imageUploader: { brandingHtml: "На основе \ u003ca href = \" https: //imgur.com/ \ "\ u003e \ u003csvg class = \" svg-icon \ "width = \" 50 \ "height = \" 18 \ "viewBox = \ "0 0 50 18 \" fill = \ "none \" xmlns = \ "http: //www.w3.org/2000/svg \" \ u003e \ u003cpath d = \ "M46.1709 9.17788C46.1709 8.26454 46.2665 7.94324 47.1084 7.58816C47.4091 7.46349 47.7169 7.36433 48.0099 7.26993C48.9099 6.97997 49.672 6.73443 49.672 5.93063C49.672 5.22043 48.9832 4.61182 48.14144.61182C47.4335 4.61182 46.7256234.9516284.61182C47.4335 4.61182 46.725623.4916284,61182C47.4335 4.61182 46.725623.4916284,61182 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \ "/ \ u003e \ u003cpath d = \" M32.492 10.1419954.037.048.037.048.048.034.048.048.0148.0148.0148.0148.0148.48.0148.0148.034.048.048.0 148.048.0 37.048.0 37.048.0 148.048.0 148.048.0 37.048.0 37.048.0 37.048.0 37.0 48.0 48.0 148.48.0 148.49.048.0 37.048.0 37.048.0 37.048.0 148.048.48.0 41.5985 12.6954 41.5985 10.1419V6.59049C41.5985 5.28821 41.1394 4.66232 40.1061 4.66232C39.0732 4.66232 38.5948 5.28821 38.5948 6.59049V9.60062C38.5948 10.8521 38.2696 11.4455 37.0451 11.5454.595 1045835.820 521 35.4954 9.60062V6.59049C35.4954 5.28821 35.0173 4.66232 34.0034 4.66232C32.9703 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \ "/> \ u003cpath fill-rule = \" evenodd \ "clip-rule = \" evenodd \ " = \ "M25.6622 17.6335C27.8049 17.6335 29.3739 16.9402 30.2537 15.6379C30.8468 14.7755 30.9615 13.5579 30.9615 11.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.66233C28.4833 4.66231 29.4502 4.66233C28.41087C 4.58.4833 4.6623.74.9502 4.66231C28.40334.6554.4502 4.66231C28.40337454.659904.58.40334.65 .1369 4.56087 21.0134 6.57349 21.0134 9.27932C21.0134 11.9852 23.003 13.913 25.3754 13.913C26.5612 13.913 27.4607 13.4902 28.1109 12.6616C28.1109 12.7229 28.1161 12.7799 28.121 12.834.13011228425.2834.2832.132834.228.1161 12.7799 28.121 12.8343.130132225.234.27.2832.130.130.1284.28 15.2321 24.1352 14.9821 23.5661 14.7787C23.176 14.6393 22.8472 14.5218 22.5437 14.5218C21.7977 14.5218 21.2429 15.0123 21.2429 15.6887C21.2429 16.7375 22.9072 17.6335 25.6622 17.6317224.97.066 7327249249 7329249 7329249 7667 7324249 7.63 7329 24.97.0 27.2119 7.09766 28.0918 7.94324 28.0918 9.27932C28.0918 10.6321 27.2311 11.5116 26.1024 11.5116C24.9737 11.5116 24.1317 10.6491 24.1317 9.27932Z \ "/ \ u003e \ u003cpath d = \" M16.80829. 1362.235.29 Cpath. 19.8079 13.2535 19.8079 11.9512V8.12928C19.8079 5.82936 18.4879 4.62866 16.4027 4.62866C15.1594 4.62866 14.279 4.98375 13.3609 5.88013C12.653 5.05154 11.6581 4.62866 10.3573 4.62866C9.34336 4.6281462 8,5327809 4,62866C9.34336 4.6281462 6,5327809 4,62866C9.34336 4.6281462 7327809.5 5.00066 5.28821 5.00066 6.59049V11.9512C5.00066 13.2535 5.47873 13.8962 6.51203 13.8962C7.54479 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 10.91179C12.862.73.93.8119.8119.844.8119.8119.8119.844.9115.98 C13.4375 13.8962 13.9157 13.2535 13.9157 11.9512V8.90741C13.9157 7.58817 14.3365 6.91179 15.4269 6.91179 C16.4027 6.91179 16.8045 7.58817 16.8045 8.94108V11.9512Z \ "/ \ u003e \ u003cpath d = \ "M3.31675 6.59049C3.31675 5.28821 2.83866 4.66232 1.82471 4.66232C0.791758 4.66232 0.313354 5.28821 0.313354 6.59049V11.9512C0.313354 13.2535 0.791758 13.8962 1.82471 13.8962C2.85775 13.896213,2535 3,31675 11,9512V6.59049Z \ "/> \ u003cpath d = \" M1.87209 0,400291C0,843612 0,400291 0 1,1159 0 1,98861C0 2,87869 0,822846 3,57676 1,87209 1,17676C2.90056 3,5787206 3,722934 2,90056 3,5767869 3,722934 2,90056 3,5767869 3,722934 3,72 0.400291Z \ "fill = \" # 1BB76E \ "/> \ u003c / svg> \ u003c / a>", contentPolicyHtml: "Вклады пользователей под лицензией \ u003ca href = \" https: //stackoverflow.com/help/licensing \ "\ u003ecc by-sa \ u003c / a> \ u003ca href = \" https://stackoverflow.com / legal / content-policy \ "> (политика содержания) \ u003c / a>", allowUrls: true }, onDemand: правда, discardSelector: ".discard-answer" , немедленноShowMarkdownHelp: true, enableSnippets: true }); } }); Спасибо за ответ на Stack Overflow! Обязательно ответьте на вопрос. Сообщите подробности и поделитесь своим исследованием! Но избегайте… Просить о помощи, разъяснениях или отвечать на другие ответы. Делать заявления, основанные на мнении; подкрепите их рекомендациями или личным опытом. Чтобы узнать больше, ознакомьтесь с нашими советами по написанию отличных ответов. Черновик сохранен Черновик отклонен Зарегистрируйтесь или войдите под своим ником StackExchange.ready (функция () { StackExchange.helpers.onClickDraftSave ('# ссылка для входа'); }); Зарегистрируйтесь с помощью Google Зарегистрируйтесь через Facebook Зарегистрируйтесь, используя электронную почту и пароль представить Опубликовать как гость название Электронное письмо Обязательно, но не отображается StackExchange.ready ( function () { StackExchange.openid.initPostLogin ('. New-post-login', 'https% 3a% 2f% 2fstackoverflow.com% 2fquestions% 2f19425104% 2fcan-i-mark-some-code-as-optional-while-debugging-in- visual-studio-2012% 23new-answer ',' question_page '); } ); Опубликовать как гость название Электронное письмо Обязательно, но не отображается Разместите свой ответ Отменить Нажимая «Опубликовать ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie. Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками отладка visual-studio или задайте свой вопрос.